home *** CD-ROM | disk | FTP | other *** search
/ Skunkware 5 / Skunkware 5.iso / src / X11 / xtartan-2.0 / main.c < prev    next >
C/C++ Source or Header  |  1995-05-24  |  6KB  |  206 lines

  1. /* main.c - main module for xtartan
  2.  * by Jim McBeath (jimmc@hisoft.uucp, jimmc@netcom.com)
  3.  *
  4.  *  7.Jan.88  jimmc  Initial definition (X10)
  5.  * 24.Oct.89  jimmc  Convert to X11, Xt; general restructuring
  6.  *  9.Jan.91  jimmc  V2.0: use XTartan resource file
  7.  */
  8.  
  9. #include <X11/Intrinsic.h>
  10. #include <X11/StringDefs.h>
  11. #include <X11/Xatom.h>
  12. #include <stdio.h>
  13. #include "patchlevel.h"
  14.  
  15. extern char *strrchr();
  16.  
  17. char *Progname;
  18. Display *TDisplay;
  19. Screen *TScreen;
  20. GC Tgc;
  21. Colormap TColormap;
  22. Window TWindow, TRootWindow;
  23. XtAppContext TAppCtx;
  24. Widget TTopWidget;
  25. Drawable TDrawable;
  26. char *NamePattern;
  27. char *SettPattern;
  28.  
  29. #include "tartcursor.h"    /* define our cursor */
  30.  
  31. static char *version=VERSION;    /* from patchlevel.h */
  32.  
  33. typedef struct rinfo {
  34.     Bool useroot;
  35.     int scale;
  36.     int lwidth;
  37.     char *tartanname;
  38.     char *action;
  39.     char *namepattern;
  40.     char *settpattern;
  41. } RInfo, *RInfoPtr;
  42. RInfo Rdata;
  43.  
  44. static XrmOptionDescRec options[] = {
  45.     {"-draw",    "action",    XrmoptionNoArg,  "draw"},
  46.     {"-list",    "action",    XrmoptionNoArg,  "list"},
  47.     {"-print",    "action",    XrmoptionNoArg,  "print"},
  48.     {"-version",    "action",    XrmoptionNoArg,  "version"},
  49.     {"-r",        "useRoot",    XrmoptionNoArg,  "TRUE" },
  50.     {"-s",        "scale",    XrmoptionSepArg, NULL },
  51.     {"-t",        "tartan",    XrmoptionSepArg, NULL },
  52.     {"-w",        "lineWidth",    XrmoptionSepArg, NULL },
  53.     {"-np",        "namePattern",    XrmoptionSepArg, NULL },
  54.     {"-sp",        "settPattern",    XrmoptionSepArg, NULL },
  55. };
  56.  
  57. static XtResource resources[] = {
  58.     {"action", "Action", XtRString, sizeof(String),
  59.         XtOffset(RInfoPtr,action), XtRString, "draw"},
  60.     {"lineWidth", "LineWidth", XtRInt,    sizeof(int),
  61.         XtOffset(RInfoPtr,lwidth), XtRImmediate, (caddr_t)1},
  62.     {"scale", "Scale", XtRInt,    sizeof(int),
  63.         XtOffset(RInfoPtr,scale), XtRImmediate, (caddr_t)2},
  64.     {"tartan", "Tartan", XtRString, sizeof(String),
  65.         XtOffset(RInfoPtr,tartanname), XtRString, "MacBeth"},
  66.     {"useRoot", "UseRoot", XtRBool, sizeof(Bool),
  67.         XtOffset(RInfoPtr,useroot), XtRBool, 0},
  68.     {"namePattern", "NamePattern", XtRString, sizeof(String),
  69.         XtOffset(RInfoPtr,namepattern), XtRString, ""},
  70.     {"settPattern", "SettPattern", XtRString, sizeof(String),
  71.         XtOffset(RInfoPtr,settpattern), XtRString, ""},
  72. };
  73.  
  74. main(argc,argv)
  75. int argc;
  76. char *argv[];
  77. {
  78.     char buf[1000];
  79.  
  80.     Progname = strrchr(argv[0],'/');
  81.     if (Progname) Progname++; 
  82.     else Progname=argv[0];
  83.  
  84.     TTopWidget = XtInitialize(Progname,"XTartan",options,XtNumber(options),
  85.         &argc,argv);
  86.     if (argc!=1) Usage(1);
  87.     TDisplay = XtDisplay(TTopWidget);
  88.     TAppCtx = XtWidgetToApplicationContext(TTopWidget);
  89.     initActions(TAppCtx);
  90.  
  91.     XtGetApplicationResources(TTopWidget,(char *)&Rdata,
  92.         resources,XtNumber(resources),(ArgList)NULL,(Cardinal)0);
  93.  
  94.     NamePattern = Rdata.namepattern;
  95.     SettPattern = Rdata.settpattern;
  96.  
  97.     readTartans();        /* load up all the tartan info */
  98.  
  99.     if (!anyTartanMatches()) {
  100.         Fatal("No tartans matching specified patterns\n");
  101.         exit(1);
  102.     }
  103.  
  104.     if (!setTartan(Rdata.tartanname)) {
  105.         Warn("Can't find tartan %s",Rdata.tartanname);
  106.         ListTartans();
  107.         exit(1);
  108.     }
  109.     setScaleWidth(Rdata.scale,Rdata.lwidth);
  110.  
  111.     if (strcmp(Rdata.action,"version")==0) {
  112.         (void)printf("%s\n",version);
  113.         exit(0);
  114.     }
  115.  
  116.     if (strcmp(Rdata.action,"list")==0) {
  117.         ListTartans();
  118.         exit(0);
  119.     }
  120.  
  121.     if (strcmp(Rdata.action,"print")==0) {
  122.         PrintTartan();
  123.         exit(0);
  124.     }
  125.  
  126.     if (strcmp(Rdata.action,"draw")!=0) {
  127.         Fatal("Bad action %s",Rdata.action);
  128.     }
  129.  
  130.     (void)sprintf(buf,"%s %s",Progname,Rdata.tartanname);
  131.     initDisplay(TTopWidget,buf,Rdata.useroot);
  132.  
  133.     (void)setTartan("");    /* update now that we have the window */
  134.  
  135.     if (Rdata.useroot) {
  136.         setrootbg(TDisplay,TScreen,TRootWindow,TDrawable);
  137.     } else {
  138.         /* for non-root window, let user enter commands */
  139.         XtAppMainLoop(TAppCtx);
  140.         /* NOTREACHED */
  141.     }
  142.     XCloseDisplay(TDisplay);
  143.     exit(0);
  144. }
  145.  
  146. static
  147. initDisplay(top,winname,rflag)
  148. Widget top;
  149. char *winname;
  150. int rflag;
  151. {
  152.     Pixmap bm,mbm;
  153.     Cursor tart_cursor;
  154.     XColor fgc, bgc;
  155.  
  156.  
  157.     TScreen = DefaultScreenOfDisplay(TDisplay);
  158.     TColormap = DefaultColormapOfScreen(TScreen);
  159.     Tgc = DefaultGCOfScreen(TScreen);
  160.     TRootWindow = DefaultRootWindow(TDisplay);
  161.     if (rflag) {
  162.         TWindow = TRootWindow;
  163.         return;
  164.     }
  165.     XtSetMappedWhenManaged(top,0);
  166.     XtRealizeWidget(top);
  167.     TWindow = XtWindow(top);
  168.     XStoreName(TDisplay,TWindow,winname);
  169.     bm = XCreateBitmapFromData(TDisplay,TWindow,tartcursor_bits,
  170.             tartcursor_width,tartcursor_height);
  171.     mbm = XCreateBitmapFromData(TDisplay,TWindow,tartmask_bits,
  172.             tartmask_width,tartmask_height);
  173.     fgc.pixel = BlackPixelOfScreen(TScreen);
  174.     bgc.pixel = WhitePixelOfScreen(TScreen);
  175.     XQueryColor(TDisplay,TColormap,&fgc);
  176.     XQueryColor(TDisplay,TColormap,&bgc);
  177.     tart_cursor = XCreatePixmapCursor(TDisplay,bm,mbm,&fgc,&bgc,
  178.             tartcursor_x_hot,tartcursor_y_hot);
  179.     if (!tart_cursor) Warn("can't make cursor");
  180.     else XDefineCursor(TDisplay,TWindow,tart_cursor);
  181.     XtMapWidget(top);
  182.     XtSetMappedWhenManaged(top,1);
  183. }
  184.  
  185. Usage(x)
  186. int x;        /* exit code (-1 means return) */
  187. {
  188.     (void)printf("usage: %s  [-draw] [-list] [-print] [std Xt args]\n\
  189. [-r] [-s scale] [-t tartanname] [-w linewidth]\n\
  190. [-np namepattern] [-sp settpattern]\n",
  191.         Progname);
  192.     (void)printf("-draw     draw the specified tartan (default)\n");
  193.     (void)printf("-list     print a list of available tartans\n");
  194.     (void)printf("-print    print out info about the specified tartan\n");
  195.     (void)printf("-r  use root window\n");
  196.     (void)printf("-s  provide an expansion scale factor\n");
  197.     (void)printf("-t  specify the tartan name to use\n");
  198.     (void)printf("-w  provide a line width factor\n");
  199.     (void)printf("-np   use only tartans with specified pattern in name\n");
  200.     (void)printf("-sp   use only tartans with specified pattern in sett\n");
  201.     if (x<0) return;
  202.     exit(x);
  203. }
  204.  
  205. /* end */
  206.